home *** CD-ROM | disk | FTP | other *** search
/ The Java 3D API Specification (2nd Edition) / The Java 3D API Specification (2nd Edition).iso / programs / examples / Billboard / MouseRotateY.java < prev    next >
Text File  |  2000-04-28  |  5KB  |  181 lines

  1. /*
  2.  *    @(#)MouseRotateY.java 1.3 00/02/10 13:13:43
  3.  *
  4.  * Copyright (c) 1996-2000 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
  7.  * modify and redistribute this software in source and binary code form,
  8.  * provided that i) this copyright notice and license appear on all copies of
  9.  * the software; and ii) Licensee does not utilize the software in a manner
  10.  * which is disparaging to Sun.
  11.  *
  12.  * This software is provided "AS IS," without a warranty of any kind. ALL
  13.  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
  14.  * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  15.  * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
  16.  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
  17.  * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
  18.  * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
  19.  * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
  20.  * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
  21.  * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
  22.  * POSSIBILITY OF SUCH DAMAGES.
  23.  *
  24.  * This software is not designed or intended for use in on-line control of
  25.  * aircraft, air traffic, aircraft navigation or aircraft communications; or in
  26.  * the design, construction, operation or maintenance of any nuclear
  27.  * facility. Licensee represents and warrants that it will not use or
  28.  * redistribute the Software for such purposes.
  29.  */
  30.  
  31. import java.awt.*;
  32. import java.awt.event.*;
  33. import java.util.*;
  34. import javax.media.j3d.*;
  35. import javax.vecmath.*;
  36. import com.sun.j3d.utils.behaviors.mouse.*;
  37.  
  38. /**
  39.  * MouseRotateY is a Java3D behavior object that lets users control the 
  40.  * rotation of an object via a mouse.
  41.  * <p>
  42.  * To use this utility, first create a transform group that this 
  43.  * rotate behavior will operate on. Then,
  44.  *<blockquote><pre>
  45.  * 
  46.  *   MouseRotateY behavior = new MouseRotateY();
  47.  *   behavior.setTransformGroup(objTrans);
  48.  *   objTrans.addChild(behavior);
  49.  *   behavior.setSchedulingBounds(bounds);
  50.  *
  51.  *</pre></blockquote>
  52.  * The above code will add the rotate behavior to the transform
  53.  * group. The user can rotate any object attached to the objTrans.
  54.  */
  55.  
  56. public class MouseRotateY extends MouseBehavior {
  57.   double  y_angle;
  58.   double  y_factor;
  59.  
  60.   /**
  61.    * Creates a rotate behavior given the transform group.
  62.    * @param transformGroup The transformGroup to operate on.
  63.    */
  64.   public MouseRotateY(TransformGroup transformGroup) {
  65.     super(transformGroup);
  66.   }
  67.  
  68.   /**
  69.    * Creates a default mouse rotate behavior.
  70.    **/
  71.   public MouseRotateY() {
  72.       super(0);
  73.    }
  74.  
  75.   /**
  76.    * Creates a rotate behavior.
  77.    * Note that this behavior still needs a transform
  78.    * group to work on (use setTransformGroup(tg)) and
  79.    * the transform group must add this behavior.
  80.    * @param flags interesting flags (wakeup conditions).
  81.    */
  82.   public MouseRotateY(int flags) {
  83.       super(flags);
  84.    }
  85.  
  86.   public void initialize() {
  87.     super.initialize();
  88.     y_angle = 0;
  89.     y_factor = .03;
  90.     if ((flags & INVERT_INPUT) == INVERT_INPUT) {
  91.        invert = true;
  92.        y_factor *= -1;
  93.     }
  94.   }
  95.  
  96.   public double getYFactor() {
  97.     return y_factor;
  98.   }
  99.   
  100.   public void setFactor( double factor) {
  101.     y_factor = factor;
  102.     
  103.   }
  104.   
  105.  
  106.   public void processStimulus (Enumeration criteria) {
  107.       WakeupCriterion wakeup;
  108.       AWTEvent[] event;
  109.       int id;
  110.       int  dx;
  111.  
  112.       while (criteria.hasMoreElements()) {
  113.          wakeup = (WakeupCriterion) criteria.nextElement();
  114.          if (wakeup instanceof WakeupOnAWTEvent) {
  115.             event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
  116.             for (int i=0; i<event.length; i++) { 
  117.           processMouseEvent((MouseEvent) event[i]);
  118.  
  119.           if (((buttonPress)&&((flags & MANUAL_WAKEUP) == 0)) ||
  120.           ((wakeUp)&&((flags & MANUAL_WAKEUP) != 0))){
  121.         
  122.         id = event[i].getID();
  123.         if ((id == MouseEvent.MOUSE_DRAGGED) && 
  124.             !((MouseEvent)event[i]).isMetaDown() && 
  125.             !((MouseEvent)event[i]).isAltDown()){
  126.           
  127.                   x = ((MouseEvent)event[i]).getX();
  128.  
  129.                   dx = x - x_last;
  130.  
  131.           if (!reset){        
  132.             y_angle = dx * y_factor;
  133.             
  134.             transformY.rotY(y_angle);
  135.             
  136.             transformGroup.getTransform(currXform);
  137.             
  138.             //Vector3d translation = new Vector3d();
  139.             //Matrix3f rotation = new Matrix3f();
  140.             Matrix4d mat = new Matrix4d();
  141.             
  142.             // Remember old matrix
  143.             currXform.get(mat);
  144.             
  145.             // Translate to origin
  146.             currXform.setTranslation(new Vector3d(0.0,0.0,0.0));
  147.             if (invert) {
  148.             currXform.mul(currXform, transformX);
  149.             currXform.mul(currXform, transformY);
  150.             } else {
  151.             currXform.mul(transformX, currXform);
  152.             currXform.mul(transformY, currXform);
  153.             }
  154.             
  155.             // Set old translation back
  156.             Vector3d translation = new 
  157.               Vector3d(mat.m03, mat.m13, mat.m23);
  158.             currXform.setTranslation(translation);
  159.             
  160.             // Update xform
  161.             transformGroup.setTransform(currXform);
  162.           }
  163.           else {
  164.             reset = false;
  165.           }
  166.  
  167.                   x_last = x;
  168.                }
  169.                else if (id == MouseEvent.MOUSE_PRESSED) {
  170.                   x_last = ((MouseEvent)event[i]).getX();
  171.                }
  172.           }
  173.         }
  174.          }
  175.       }
  176.  
  177.       wakeupOn (mouseCriterion);
  178.       
  179.    }
  180. }
  181.